#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stddef.h>

typedef int ElementType;
typedef struct LNode *PtrToLNode;

struct LNode {
    ElementType Data;
    PtrToLNode Next;
};

typedef PtrToLNode Position;
typedef PtrToLNode List;

#define ERROR NULL

/* 查找 */
/* 在 L 中查找值为 X 的元素 */
Position Find(List L, ElementType X) {
    /* p 指向 L 的第一个结点 */
    Position p = L;

    while (p && p->Data != X)
        p = p->Next;

    if (p) return p;
    else return ERROR;
}

/* 插入 */
/* 在 L 的指定位置 P 前插入一个新元素 X */
/* 默认 L 有头结点 */
bool Insert(List L, ElementType X, Position P) {
    Position tmp, pre;

    /* 查找 P 的前一个结点 */
    for (pre = L; pre && pre->Next != P; pre = pre->Next);
    if (pre == NULL) {  /* P 所指的结点不在 L 中 */
        printf("插入位置参数错误\n");
        return false;
    } else {  /* 找到了 P 的前一个结点 pre */
        /* 在 P 前插入新结点 */
        tmp = (Position) malloc(sizeof(struct LNode)); /* 申请，填装结点 */
        tmp->Data = X;
        tmp->Next = P;
        pre->Next = tmp;
        return true;
    }
}

/* 删除 */
/* 从 L 中删除指定位置 P 的元素 */
/* 默认 L 有头结点 */
bool Delete(List L, Position P) {
    Position pre;

    /* 查找 P 的前一个结点 */
    for (pre = L; pre && pre->Next != P; pre = pre->Next) ;
    if (pre == NULL || P == NULL) {
        printf("删除位置参数错误\n");
        return false;
    } else {
        /* 找到了 P 的前一个结点 pre */
        /* 将 P 位置的结点删除 */
        pre->Next = P->Next;
        free(P);
        return true;
    }
}

int main() {
    ElementType X = 1;
    List L = (List) malloc(sizeof(struct LNode));
    L->Data = X;
    L->Next = NULL;

    for (X = 2; X <= 40; X++) {
        Insert(L, X, NULL);
    }

    X = 10;
    Position p = Find(L, X);
    if (p == ERROR)
        printf("未找到元素%d\n", X);
    else
        printf("找到了元素%d\n", X);

    Delete(L, p);

    X = 101;
    p = Find(L, X);
    if (p == ERROR)
        printf("未找到元素%d\n", X);
    else
        printf("找到了元素%d\n", X);

    Position tmp = L;
    while (tmp) {
        printf("%d ", tmp->Data);
        tmp = tmp->Next;
    }
}
